package desmontec.documentos

import java.util.Date;

import desmontec.funcionarios.*;
import desmontec.query.dpg.DPGQuery;
import desmontec.sistema.SecUser
import desmontec.alertas.*

/**
 * Controlador do fluxo de CRUDE de uma DPG e sua quantidade m�xima de materiais
 * 
 * @author arthur
 * @since 21/03/2011
 *
 */
class DPGController {
	
	// arthur.marques - INICIO	
	// Ele injeta automaticamente o service no controller
	DpgService dpgService
	// arthur.marques - FIM
	
	def springSecurityService
	EngenheiroService engenheiroService
	static final Integer DPG_INVALIDADA = 1;
	static final Integer DPG_VALIDADA = 0;
    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
	
	
    def index = {
        redirect(action: "list", params: params)
    }

    def list = {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [
			DPGInstanceList: dpgService.consultarDPGsValidas(params),
			DPGInstanceTotal: dpgService.consultarDPGsValidas().size()						
		]
    }
	
	def exibirTodasDPGs = { 
		params.max = Math.min(params.max ? params.int('max') : 10, 100)
        render(view: "list", model: [
			DPGInstanceList: dpgService.consultarDPGs(params),
			DPGInstanceTotal: dpgService.consultarDPGs().size()						
		])
	}

	// arthur.marques - INICIO

	// FLUXO
	// 1. PREPARA A DPG
    def criarDPG = {
		// remove qualquer DPG na sess�o
		session.removeAttribute "dpg"
		
		// cria uma nova DPG no sistema
        def DPGInstance = new DPG()
		
		// cria a quantidade maxima de materiais de uma DPG 
		def quantidadeMaximaDeMateriais = new QuantidadeMaximaDeMateriais()
		
        DPGInstance.properties = params
		
		DPGInstance.materiais = quantidadeMaximaDeMateriais
		//fernando.alves - inicio
		def user = (SecUser) springSecurityService.getCurrentUser()
		DPGInstance.usuario = user
		//fernando.alves - fim
		def engTemp =  Engenheiro.findByFlagEngenheiroPadrao(EngenheiroController.FLAG_PADRAO)
		def idPadrao = 0
		if(engTemp != null){
			idPadrao = engTemp.id
		}
        return [DPGInstance: DPGInstance, idRespPadrao: idPadrao, listaEngenheiros:engenheiroService.engenheirosDoUsuario()]
    }
	
	// 2. VALIDA A DPG
	def salvarDPG = {
		def DPGInstance = new DPG(params)
		//fernando.alves - inicio
		DPGInstance.usuario =  (SecUser) springSecurityService.getCurrentUser()
		
		DPGInstance.inicioDoPrazoValidade = params.dataInicioPrazoValidade
		DPGInstance.fimDoPrazoValidade = params.dataFimPrazoValidade

		//fernando.alves - fim
		DPGInstance.materiais = new QuantidadeMaximaDeMateriais()
		// se estiver OK coloca o objeto na sess�o e passa para a pr�xima tela
		if (DPGInstance.validate()){
			session.setAttribute "dpg", DPGInstance
			redirect(action: "criarMateriais")
		} else {
			// se n�o, permanece na tela de criar DPG
			render(view: "criarDPG", model: [DPGInstance: DPGInstance, listaEngenheiros:engenheiroService.engenheirosDoUsuario()])
		}
	}
	
	// 3. PREPARA A QUANTIDADE MAXIMA DE MATERIAIS
	def criarMateriais = {
		def quantidadeMateriaisInstance = new QuantidadeMaximaDeMateriais()
		quantidadeMateriaisInstance.properties = params
		// recupera a DPG que foi adicionada na sess�o
		def DPGInstance = (DPG) session.getAttribute("dpg")
		//fernando.alves - inicio
		DPGInstance.usuario =  (SecUser) springSecurityService.getCurrentUser()
		//fernando.alves - fim
		return [quantidadeMateriaisInstance: quantidadeMateriaisInstance,
				DPGInstance: DPGInstance]
		
	}
	
	// 4. VALIDA MATERIAIS
	def salvarMateriais = {
		def DPGInstance = (DPG) session.getAttribute("dpg")
		//fernando.alves - inicio
		DPGInstance.usuario =  (SecUser) springSecurityService.getCurrentUser()
		//fernando.alves - fim
		def quantidadeMateriaisInstance = new QuantidadeMaximaDeMateriais(params)
		// se estiver tudo OK redireciona para a�ao de SALVAR na BASE
		if (quantidadeMateriaisInstance.validate()) {
			DPGInstance.materiais = quantidadeMateriaisInstance
			session.setAttribute "dpg", DPGInstance
			redirect(action: "concluirDPG")
		} else {
			render(	view: "criarMateriais",				
				 	model: [quantidadeMateriaisInstance: quantidadeMateriaisInstance, DPGInstance: DPGInstance] )
		}
	}
	// 4.1 voltar para a tela de criar DPG
	def voltarParaCriarDPG = {
		def DPGInstance = (DPG) session.getAttribute("dpg")
		//fernando.alves - inicio
		DPGInstance.usuario =  (SecUser) springSecurityService.getCurrentUser()
		//fernando.alves - fim
		render(view: "criarDPG", model: [DPGInstance: DPGInstance, listaEngenheiros:engenheiroService.engenheirosDoUsuario()])
	}
	
	// 5. SALVA DPG e QUANTIDADE DE MATERIAIS 
    def concluirDPG = {
		def DPGInstance = (DPG) session.getAttribute("dpg")
		//fernando.alves - inicio
		DPGInstance.usuario =  (SecUser) springSecurityService.getCurrentUser()
		//fernando.alves - fim
		def quantidadeMateriaisInstance = DPGInstance.materiais
		if (quantidadeMateriaisInstance.save(flush: true)){
			if (DPGInstance.save(flush: true)) {
				//fernando.alves - inicio
				def user = (SecUser) springSecurityService.getCurrentUser()
				Calendar dataAtual = GregorianCalendar.getInstance();
				if (dataAtual.getTime().after(DPGInstance.fimDoPrazoValidade)){
					def alertaNovo = new AlertaDPG(dpg: DPGInstance, flagTipo:TipoAlerta.ALERTA_DATA_INVALIDA, flagAlertar:"S")
					alertaNovo.save(flush:true)
				}
				flash.message = "${message(code: 'desmontec.documentos.DPG.default.created.message')}"
				def resposta = 0
				//depois de adicionar a dpg, verificamaos a validade da mesma... nesse caso levando em consideracao
				//apenas a data
				resposta = dpgService.atualizaValidadeDPG(DPGInstance)
				if (resposta == DPG_INVALIDADA){
					flash.message = "${message(code: 'desmontec.documentos.DPG.default.created.message')}\n"+
				                  "DPG numero "+DPGInstance.numero+" invalidada."
				}
				//fernando.alves - fim
				session.removeAttribute "dpg"
				redirect(action: "exibirDPG", id: DPGInstance.id)
			} else {
				render(	view: "criarMateriais",
					model: [quantidadeMateriaisInstance: DPGInstance.materiais, DPGInstance: DPGInstance] )
			}
		} else {
			render(	view: "criarMateriais",
				model: [quantidadeMateriaisInstance: DPGInstance.materiais, DPGInstance: DPGInstance] )
		}
		
    }
	// FLUXO - FIM

	
    def exibirDPG = {
        def DPGInstance = DPG.get(params.id)
        if (!DPGInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'DPG.label', default: 'DPG'), params.id])}"
            redirect(action: "list")
        }
        else {
            [DPGInstance: DPGInstance]
        }
    }

    def editarDPG = {
        def DPGInstance = DPG.get(params.id)
		def qtdMateriais = DPGInstance.materiais
        if (!DPGInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'DPG.label', default: 'DPG'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [DPGInstance: DPGInstance, qtdMateriais: qtdMateriais]
        }
    }

    def atualizarDPG = {
        def DPGInstance = DPG.get(params.id)
		def qtdMateriais = QuantidadeMaximaDeMateriais.get(DPGInstance.materiais.id)
		// isso � o mesmo que testar objeto diferente de NULL
        if (DPGInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (DPGInstance.version > version) {
                    
                    DPGInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'DPG.label', default: 'DPG')] as Object[], "Another user has updated this DPG while you were editing")
                    render(view: "editarDPG",
						 model: [DPGInstance: DPGInstance, qtdMateriais:qtdMateriais ])
                    return
                }
            }
            DPGInstance.properties = params
			qtdMateriais.properties = params
			
            if (!DPGInstance.hasErrors() && !qtdMateriais.hasErrors()) {
				def validarDPG = DPGInstance.validate()
				def validarMateriais = qtdMateriais.validate()
				if(validarDPG && validarMateriais){
					
					if(DPGInstance.save(flush: true) && qtdMateriais.save(flush: true)){
						def resposta = 0
						//fernando.alves - inicio
						flash.message = "${message(code: 'desmontec.documentos.DPG.default.updated.message')}"
						//depois de adicionar a dpg, verificamaos a validade da mesma... nesse caso levando em consideracao
						//apenas a data
						resposta = dpgService.atualizaValidadeDPG(DPGInstance)
						if (resposta == DPG_INVALIDADA){
							flash.message = "${message(code: 'desmontec.documentos.DPG.default.created.message')}\n"+
									"DPG numero "+DPGInstance.numero+" invalidada."
						}
						//fernando.alves - fim
						
						redirect(action: "exibirDPG", id: DPGInstance.id)
					} else {
						render(view: "editarDPG",
							model: [DPGInstance: DPGInstance, qtdMateriais:qtdMateriais ])
					}
					
				} else {
					render(view: "editarDPG",
						 model: [DPGInstance: DPGInstance, qtdMateriais:qtdMateriais ])
				}
            }
            else {
                render(view: "editarDPG",
						 model: [DPGInstance: DPGInstance, qtdMateriais:qtdMateriais ])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'DPG.label', default: 'DPG'), params.id])}"
            redirect(action: "list")
        }
    }
 

    def deletarDPG = {
		// problema em manipular as mensagens
		
        def DPGInstance = DPG.get(params.id)
        if (DPGInstance) {
            try {
                DPGInstance.delete(flush: true)
                flash.message = "${message(code: 'desmontec.documentos.DPG.default.deleted.message')}"
                redirect(action: "list")
            } catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'DPG.label', default: 'DPG'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'DPG.label', default: 'DPG'), params.id])}"
            redirect(action: "list")
        }
    }
	// arthur.marques - FIM
	
	// arthur.marques - INICIO
	def procurar = {
		
		DPGQuery query = new DPGQuery();
		
		bindData(query, params)
		query.setUsuario(((SecUser) springSecurityService.getCurrentUser()).id)
		
		
		
		
		if (request.method == 'POST'){
			def listaDPGs = dpgService.consultarDPG(query)
			if (listaDPGs.size == 0){
				flash.message = "Nenhuma DPG foi encontrada com estes criterios de busca"
					
			}
			render(view:'list', model:[
				DPGInstanceList: listaDPGs,
				DPGInstanceTotal: DPG.count()				
			])
		}
		[listaEngenheiros: Engenheiro.findAllByUsuario((SecUser) springSecurityService.getCurrentUser())]
	}
	// arthur.marques - FIM
	
	def exibirResponsavel = {
		def idResponsavel = params.id
		def engenheiro = Engenheiro.get(idResponsavel)
		return [ResponsavelInstance: engenheiro]
		
	}
}
